home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / search / lsmsearc.tar / lsmsearc / lsmsearch / lsmsearch-dialog < prev    next >
Text File  |  1995-07-12  |  4KB  |  166 lines

  1. #!/usr/local/bin/perl
  2. # Written by Adam P. Jenkins <apj@twain.oit.umass.edu>
  3. # Finished June 15, 1995
  4.  
  5. #set this to the name and path of LSM file.  
  6. $LSMFILE = "/usr/local/lib/LSM.gz";
  7. #set this to name of program to unzip LSMFILE
  8. $UNZIPPER = "gunzip -c";
  9.  
  10. require 5.000;
  11.  
  12. require "dialog.pl";
  13. use Getopt::Std;
  14. use File::Basename;
  15.  
  16. $/ = "\nEnd";
  17.  
  18. sub printhelp {
  19. my $prog = basename($0);
  20.     print <<EOT
  21. $prog does a case insensitive search of the Linux Software Map.
  22. The options are:
  23.     -d: Search only the Description field.
  24.     -t: Search only the Title field.
  25.     -k: Search only the Keywords field.
  26.         -h: Get this help screen.
  27.     regexpression: A regular expression to search for.
  28. Default is to search every line.
  29. EOT
  30. }
  31.  
  32. sub mainmenu {
  33.     return &rhs_menu("LSMSEARCH Main Menu", # Title
  34.           "Choose Options to limit the search, or Search to search for
  35. a pattern",            # Message
  36.           60,        # width
  37.           3,        # Number of menu items
  38.           "Options", "Set search options.",
  39.           "Search", "Search for a pattern.",
  40.           "Quit", "Quit this program.");
  41. }
  42.  
  43. sub setoptions {
  44.     my $res = &rhs_checklist("LSMSEARCH Options", # Title
  45.                  "Choose options to delimit the search.
  46. If no options are checked, all fields will be searched.
  47. Use SPACE to toggle an option on/off.",
  48.                  60,        # width
  49.                  3,        # number of items
  50.                  "Description", "Search the description field.",
  51.                  $options{'description'},
  52.                  "Keywords", "Search the keywords field.",
  53.                  $options{'keywords'},
  54.                  "Title", "Search the title field.",
  55.                  $options{'title'});
  56.  
  57.     $options{'description'} = grep(/Description/, @dialog_result) ? 1 : 0;
  58.     $options{'keywords'} = grep(/Keywords/, @dialog_result) ? 1 : 0;
  59.     $options{'title'} = grep(/Title/, @dialog_result) ? 1 : 0;
  60.     return $res;
  61.  
  62. sub getpattern {
  63.     my $res = &rhs_inputbox("LSMSEARCH",    # Title
  64.                 "Type in a regular expression to search for.",
  65.                 60,    # width
  66.                 $Pattern); # default pattern
  67.     $Pattern = $dialog_result;
  68.     return $res;
  69. }
  70.  
  71. sub dosearch {
  72.     my $BASENAME = basename($0);
  73.     my $TMPFILE = "/tmp/$$.$BASENAME.tmp";
  74.     open(TMPFILE, ">$TMPFILE") or die "Can't open temp file.\n";
  75.     open(LSMFILE, "$UNZIPPER $LSMFILE |") or die "Can't open $LSMFILE\n";
  76.     select(TMPFILE);
  77.  
  78. # if no options were given, do it the fastest way
  79.     if (!$options{'title'} && !$options{'description'}
  80.     && !$options{'keywords'})
  81.     {
  82.         # This actually reads in a whole record at a time, up to a line
  83.         # beginning with /^End/.  Because I set $/ to "\nEnd".
  84.         while (<LSMFILE>) {
  85.         if (/$Pattern/i) {
  86.             print;    # prints record to the TMPFILE 
  87.         } 
  88.         }
  89.     } else {        # else process options.
  90.         while (<LSMFILE>) {
  91.         $found = 0;
  92.         if ($options{'title'}) {
  93.             if (/\nTitle\:.*?\n(?=[\w-]+\:)/s) {
  94.             $tmp = $&;
  95.             if ($tmp =~ /$Pattern/i) {
  96.                 $found = 1;
  97.             }
  98.             }
  99.         }
  100.         if ($options{'description'}) {
  101.             if (/\nDescription\:.*?\n(?=[\w-]+\:)/s) {
  102.             $tmp = $&;
  103.             if ($tmp =~ /$Pattern/i) {
  104.                 $found = 1;
  105.             }
  106.             }
  107.         }
  108.         if ($options{'keywords'}) {
  109.             if (/\nKeywords\:.*?\n(?=[\w-]+\:)/s) {
  110.             $tmp = $&;
  111.             if ($tmp =~ /$Pattern/i) {
  112.                 $found = 1;
  113.             }
  114.             }
  115.         }
  116.         if ($found) {
  117.             print;
  118.         }
  119.         }            # while
  120.     }            # else
  121.     
  122.     close LSMFILE;          
  123.     close TMPFILE;
  124.  
  125.     &rhs_textbox("Records containing $Pattern", $TMPFILE, 80, 24);
  126.     unlink $TMPFILE;
  127. }
  128.  
  129. sub mainloop {
  130.     &mainmenu;
  131.     while ($dialog_result !~ /^Quit/) {
  132.     if ($dialog_result =~ /^Options/)
  133.         { &setoptions; }
  134.     elsif ($dialog_result =~ /^Search/) {
  135.         if (&getpattern) {
  136.         if ($Pattern) { &dosearch; }
  137.         }
  138.     }              
  139.     &mainmenu;
  140.     }
  141.  
  142.     &rhs_clear;
  143. }
  144.     
  145.  
  146. # Main program
  147. getopts('tdkh') or $opt_h = 1;
  148.  
  149. if ($opt_h) {            # help option
  150.     &printhelp;
  151.     exit 1;
  152. }
  153.  
  154. $options{'title'}       = $opt_t ? $opt_t : 0;
  155. $options{'description'} = $opt_d ? $opt_d : 0;
  156. $options{'keywords'}    = $opt_k ? $opt_k : 0;
  157.  
  158. $Pattern = '';
  159. if ($#ARGV >= 0) {        # just do it once 
  160.     $Pattern = shift;
  161.     &dosearch;
  162. } else {            # run program interactively
  163.     &mainloop;
  164. }
  165.